home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / BG_SRC.ZIP / MOUSY.C < prev    next >
C/C++ Source or Header  |  1992-04-05  |  9KB  |  291 lines

  1. /*
  2.  *
  3.  * Functions for the mouse TSR to BG.EXE
  4.  * 29th February 1992
  5.  *
  6.  */
  7.  
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #include <conio.h>
  12. #include <dos.h>
  13. #include "bg.h"
  14. #include "mousy.h"
  15.  
  16. /***************************************************************************/
  17.  
  18. void Mouse (short far* m1, short far* m2, short far* m3,
  19.             short far* m4, short far* m5)
  20. /*
  21. PURPOSE: To call the mouse interrupt procedure with the parameters given.
  22. NOTES:   This has been adapted from a Turbo Pascal routine in a very
  23.          old Microsoft Mouse manual.
  24. */
  25. {
  26.    union  REGS  Cpu_Reg ;
  27.    struct SREGS Seg_Reg ;
  28.  
  29.    if ((*m1) >= 0) {
  30.        Cpu_Reg.x.ax = (uint)(*m1) ;
  31.        Cpu_Reg.x.bx = (uint)(*m2) ;
  32.        Cpu_Reg.x.cx = (uint)(*m3) ;
  33.  
  34.        if (((*m1) == SET_G_CURS_BLOCK) ||
  35.        ((*m1) == SET_INTERRUPT)    ||
  36.        ((*m1) == SWAP_INTS)        ||
  37.        ((*m1) == SAVE_MOUSE_STATE) ||
  38.        ((*m1) == REST_MOUSE_STATE)    ) {
  39.        Cpu_Reg.x.dx = ((unsigned long)m4) & 0xFFFF ;
  40.        Seg_Reg.es   = ((unsigned long)m4) >> 16 ;
  41.  
  42.        } else if ((*m1) == CONDITIONAL_OFF) {
  43.        Cpu_Reg.x.cx = (uint)(*m2) ;
  44.        Cpu_Reg.x.dx = (uint)(*m3) ;
  45.        Cpu_Reg.x.si = (uint)(*m4) ;
  46.        Cpu_Reg.x.di = (uint)(*m5) ;
  47.  
  48.        } else {
  49.        Cpu_Reg.x.dx = (uint)(*m4) ;
  50.        }
  51.  
  52.        (void)int86x (MS_MOUSE_INT_NUM,&Cpu_Reg,&Cpu_Reg,&Seg_Reg) ;
  53.  
  54.        if ((*m1) == SWAP_INTS) {
  55.        (*m2) = Seg_Reg.es ;
  56.        }
  57.  
  58.        (*m1)  = Cpu_Reg.x.ax ;
  59.        (*m2)  = Cpu_Reg.x.bx ;
  60.        (*m3)  = Cpu_Reg.x.cx ;
  61.        (*m4)  = Cpu_Reg.x.dx ;
  62.     }
  63. }
  64.  
  65. /***************************************************************************/
  66.  
  67. void Check_Mouse (void)
  68. /*
  69. PURPOSE: To exit if the mouse driver is not installed.
  70. NOTES:   1) Copied from a very old Microsoft Mouse Manual.
  71. */
  72. {
  73.     union  REGS  inregs,outregs ;
  74.     struct SREGS segregs ;
  75.     long         address ;
  76.     uchar        first_byte ;
  77.  
  78.     inregs.x.ax = 0x3533 ;
  79.     (void)intdosx (&inregs,&outregs,&segregs) ;
  80.     address = (((long)segregs.es)<<16) + (long)outregs.x.bx ;
  81.     first_byte = (uchar)(*(long far *)address) ;
  82.     if ((address == 0) || (first_byte == 0xCF)) {
  83.         printf ("\nMouse driver not installed") ;
  84.         exit (1) ;
  85.     }
  86. }
  87.  
  88. /***************************************************************************/
  89.  
  90. int Init_Mouse (void)
  91. /*
  92. PURPOSE: To init the mouse, returning non-zero if we are successful
  93. */
  94. {
  95.     short m1,m2,m3,m4,m5 ;
  96.  
  97.     m1 = RESET_AND_STAT ;  /* Initialise the mouse */
  98.     Mouse (&m1,&m2,&m3,&m4,&m5) ;
  99.  
  100.     if (m1 == 0) {
  101.         return (FALSE) ;
  102.     } else {
  103.         return (TRUE) ;
  104.     }
  105. }
  106.  
  107. /***************************************************************************/
  108.  
  109. void Set_Mouse_Pos (short x, short y)
  110. /*
  111. PURPOSE: To put the mouse at the given position.
  112. */
  113. {
  114.     short m1,m2,m3,m4,m5 ;
  115.     m1 = SET_MOUSE_POS ;
  116.     m3 = x ;    /* at the centre of the screen */
  117.     m4 = y ;
  118.     Mouse (&m1,&m2,&m3,&m4,&m5) ;
  119. }
  120.  
  121. /***************************************************************************/
  122.  
  123. void Set_Mouse_Limits (short x0, short y0, short x1, short y1)
  124. /*
  125. PURPOSE: To set a limit on the range of the mouse.
  126. */
  127. {
  128.     short m1,m2,m3,m4,m5 ;
  129.  
  130.     m1 = SET_X_MIN_MAX ;
  131.     m3 = x0 ;     /* minimum x */
  132.     m4 = x1 ;     /* maximum x */
  133.     Mouse (&m1,&m2,&m3,&m4,&m5) ;
  134.  
  135.     m1 = SET_Y_MIN_MAX ;
  136.     m3 = y0 ;     /* minimum y */
  137.     m4 = y1 ;     /* maximum y */
  138.     Mouse (&m1,&m2,&m3,&m4,&m5) ;
  139. }
  140.  
  141. /***************************************************************************/
  142.  
  143. #define SHP_LEN 32
  144.  
  145. static short Std_Shape [SHP_LEN] = {
  146.                     0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
  147.                     0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
  148.                     0xff80,0xff00,0xc600,0xc600,0xc300,0xf180,0xf8c0,0xcc60,
  149.                     0x8630,0x0318,0x0018c,0x00c6,0x0063,0x0036,0x001e,0x0008} ;
  150.  
  151. static short In_Shape [SHP_LEN] = {
  152.                     0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
  153.                     0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
  154.                      0x180, 0x180, 0x180, 0x7e0, 0x3c0,0x1188,0x1818,0xfc3f,
  155.                     0xfc3f,0x1818,0x1188, 0x3c0, 0x7e0, 0x180, 0x180,0x180} ;
  156.  
  157. static short Out_Shape [SHP_LEN] = {
  158.                     0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
  159.                     0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
  160.                     0x0180,0x03c0,0x07e0,0x0180,0x0180,0x2184,0x6006,0xfc3f,
  161.                     0xfc3f,0x6006,0x2184, 0x180, 0x180, 0x7e0, 0x3c0,0x180} ;
  162.  
  163. static short Quest_Shape [SHP_LEN] = {
  164.                     0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
  165.                     0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
  166.                     0x03c0,0x07e0,0x0e70,0x0c30,0x0c30,0x0070,0x00e0,0x01c0,
  167.                     0x0180,0x0180,0x0180,0x0180,0x0000,0x0000,0x0180,0x0180} ;
  168.  
  169. short The_Shape [SHP_LEN] ;
  170.  
  171. void Set_Cursor_Shape (short Code, short Hot_X, short Hot_Y)
  172. /*
  173. PURPOSE: To set the cursor shape, which is an array of 32 shorts. The first
  174. 16 shorts tell us if the cursor is part of the cursor or screen, the
  175. last 16 shorts tell us how the pixel contributes to the colour of the
  176. cursor.
  177. */
  178. {
  179.     short m1,m2,m3,m5 ;
  180.  
  181.     switch (Code) {
  182.         case IN_ARROW_SHP :
  183.             memcpy (The_Shape,In_Shape,SHP_LEN*sizeof(short)) ;
  184.             break ;
  185.         case OUT_ARROW_SHP :
  186.             memcpy (The_Shape,Out_Shape,SHP_LEN*sizeof(short)) ;
  187.             break ;
  188.         case QUESTION_SHP :
  189.             memcpy (The_Shape,Quest_Shape,SHP_LEN*sizeof(short)) ;
  190.             break ;
  191.         default :
  192.             memcpy (The_Shape,Std_Shape,SHP_LEN*sizeof(short)) ;
  193.             break ;
  194.     }
  195.  
  196.     m1 = SET_G_CURS_BLOCK ;
  197.     m2 = Hot_X ;
  198.     m3 = Hot_Y ;
  199.     Mouse (&m1,&m2,&m3,(short far*)The_Shape,&m5) ;
  200. }
  201.  
  202. /***************************************************************************/
  203.  
  204. void Show_Mouse_Cursor (void)
  205. {
  206.     short m1,m2,m3,m4,m5 ;
  207.     m1 =  SHOW_CURSOR ;
  208.     Mouse (&m1,&m2,&m3,&m4,&m5) ;
  209. }
  210.  
  211. /***************************************************************************/
  212.  
  213. void Hide_Mouse_Cursor (void)
  214. {
  215.     short m1,m2,m3,m4,m5 ;
  216.     m1 = HIDE_CURSOR ;
  217.     Mouse (&m1,&m2,&m3,&m4,&m5) ;
  218. }
  219.  
  220. /***************************************************************************/
  221.  
  222. short Get_Mouse_Or_Key (short* Mx, short* My)
  223.  
  224. /*
  225. PURPOSE: To wait for input from the user, either as a keyboard hit
  226.          or as a mouse button hit.
  227. NOTES: 1) If a key had been hit then we return
  228.            FUN_BIT or KEY_BIT with the key code in lower eight bytes.
  229.        2) If the mouse button has been pressed then we return
  230.            LEFT_BIT or RIGHT_BIT and Mx and My are set to the position.
  231. */
  232. {
  233.     char  Key_0 ;
  234.     short Input_Code ;
  235.     short m1,m2,m3,m4,m5 ;
  236.  
  237.     Input_Code = 0 ;
  238.     do {
  239.         m1 = GET_STAT_AND_POS ;
  240.         Mouse (&m1,&m2,&m3,&m4,&m5) ;
  241.         if (m2 == LEFT_BUT) {
  242.             Input_Code = LEFT_BIT ;
  243.     } else if (m2 == RIGHT_BUT) {
  244.             Input_Code = RIGHT_BIT ;
  245.         } else if (kbhit()) {
  246.             Key_0 = (char)getch () ;
  247.             if (Key_0 == FUN_PREFIX) {
  248.                 Input_Code = FUN_BIT | getch () ;
  249.             } else {
  250.                 Input_Code = KEY_BIT | Key_0 ;
  251.             }
  252.         }
  253.  
  254.     } while (Input_Code == 0) ;
  255.  
  256.     (*Mx) = m3 ;
  257.     (*My) = m4 ;
  258.  
  259.     if (Input_Code & (LEFT_BIT | RIGHT_BIT)) {
  260.         /* Wait for user to release mouse button */
  261.         do {
  262.             m1 = GET_STAT_AND_POS ;
  263.             Mouse (&m1,&m2,&m3,&m4,&m5) ;
  264.         } while ((m2 == LEFT_BUT) || (m2 == RIGHT_BUT)) ;
  265.     }
  266.  
  267.     return (Input_Code) ;
  268. }
  269.  
  270. /***************************************************************************/
  271.  
  272. void Start_Up_Mouse (void)
  273.  
  274. {
  275.     extern Screen_Const_t Grafs ;
  276.  
  277.     Check_Mouse () ;
  278.     if (!Init_Mouse ()) {
  279.         Error_Exit ("Mouse not found") ;
  280.     }
  281.     Set_Mouse_Pos (Grafs.Board_X+(Grafs.Board_Wide/2),
  282.                    Grafs.Board_Y+(Grafs.Board_High/2)) ;
  283.     Set_Mouse_Limits (Grafs.Board_X+2,Grafs.Board_Y+2,
  284.                       Grafs.Board_X+Grafs.Board_Wide-4,
  285.                       Grafs.Board_Y+Grafs.Board_High-4) ;
  286.     Set_Cursor_Shape (NORMAL_SHP,0,0) ;
  287. }
  288.  
  289. /***************************************************************************/
  290.  
  291.